package annotation.load;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

//通过反射，动态创建对象
//动态创建对象时，可以获取指定对象的构造器
public class ReflectObject {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //获得Class对象
        Class labyClass = Class.forName("annotation.load.Laby");

        //构造对象
        Laby la1 = (Laby) labyClass.newInstance();//本质是调用了类的无参构造器
        System.out.println(la1);

        //获取指定参数构造器创建对象
        Constructor constructor = labyClass.getDeclaredConstructor(int.class,String.class);
        Laby la2 = (Laby) constructor.newInstance(999,"Lby");
        System.out.println(la2);
        Constructor nopConstructor = labyClass.getConstructor();
        Laby la = (Laby) nopConstructor.newInstance();

        //通过反射调用方法
        Laby la3 = (Laby) labyClass.newInstance();
        //通过反射获取指定类方法
        Method setName = labyClass.getMethod("setName", String.class);
        //invoke:激活方法
        //调用(对象,"方法的值")
        setName.setAccessible(true);
        setName.invoke(la3,"Blue");
        System.out.println(la3.getName());

        //通过反射操作属性
        Laby la4 = (Laby) labyClass.newInstance();
        //通过反射获取指定类属性
        Field name = labyClass.getDeclaredField("name");
        //不能直接操作类的私有属性，我们需要关闭程序的安全检查
        name.setAccessible(true);//设置属性安全检查
        name.set(la4,"Red");
        System.out.println(la4.getName());

    }
}
